/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.credsoft.copcred.model.vo;

import br.gov.caixa.gisutsa.framework.tapiocaframework.persistencia.AbstractEntity;
import java.math.BigDecimal;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

/**
 *
 * @author c090347
 * @since 2009-06-17
 */
@Entity
@Table(name = "proposta")
@Inheritance(strategy = InheritanceType.JOINED)
public class Proposta extends AbstractEntity {

    private static final long serialVersionUID = -548151782002917419L;
    private Long id;
    private int versao;
    private Banco banco;
    private Parceiro parceiro;
    private Portifolio portifolio;
    private Corretor corretor;
    private Cliente cliente;
    private Usuario usuarioCadastro;
    private Usuario usuarioFinalizacao;
    private BigDecimal valorProposta;
    private Calendar dataAssinatura;
    private Calendar dataVigencia;
    private Calendar dataFinalizacao;
    private String motivoFinalizacao;
    private Double percentualComissaoRecebida;
    private Double percentualComissaoCorretor;
    private Calendar dataRecebimentoComissao;
    private Calendar dataPagamentoComissao;
    private BigDecimal valorRecebidoComissao;
    private BigDecimal valorPagoComissao;
    private boolean acatarPrejuizo;

    public Proposta() {
        this.acatarPrejuizo = false;
    }

    public Proposta(Long id) {
        this();
        this.id = id;
    }

    public Proposta(Long id, Banco banco, Parceiro parceiro, Portifolio portifolio, Corretor corretor, Cliente cliente, Usuario usuarioCadastro, Usuario usuarioFinalizacao, BigDecimal valorProposta, Calendar dataAssinatura, Calendar dataVigencia, Calendar dataFinalizacao, String motivoFinalizacao, Double percentualComissaoRecebida, Double percentualComissaoCorretor, Calendar dataRecebimentoComissao, Calendar dataPagamentoComissao, BigDecimal valorRecebidoComissao, BigDecimal valorPagoComissao, boolean acatarPrejuizo) {
        this.id = id;
        this.banco = banco;
        this.parceiro = parceiro;
        this.portifolio = portifolio;
        this.corretor = corretor;
        this.cliente = cliente;
        this.usuarioCadastro = usuarioCadastro;
        this.usuarioFinalizacao = usuarioFinalizacao;
        this.valorProposta = valorProposta;
        this.dataAssinatura = dataAssinatura;
        this.dataVigencia = dataVigencia;
        this.dataFinalizacao = dataFinalizacao;
        this.motivoFinalizacao = motivoFinalizacao;
        this.percentualComissaoRecebida = percentualComissaoRecebida;
        this.percentualComissaoCorretor = percentualComissaoCorretor;
        this.dataRecebimentoComissao = dataRecebimentoComissao;
        this.dataPagamentoComissao = dataPagamentoComissao;
        this.valorRecebidoComissao = valorRecebidoComissao;
        this.valorPagoComissao = valorPagoComissao;
        this.acatarPrejuizo = acatarPrejuizo;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "proposta_id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    @Column(name = "versao", nullable = false)
    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    @ManyToOne(targetEntity = Banco.class)
    @JoinColumn(name = "banco_id", nullable = false)
    public Banco getBanco() {
        return banco;
    }

    public void setBanco(Banco banco) {
        this.banco = banco;
    }

    @ManyToOne(targetEntity = Parceiro.class)
    @JoinColumn(name = "parceiro_id", nullable = true)
    public Parceiro getParceiro() {
        return parceiro;
    }

    public void setParceiro(Parceiro parceiro) {
        this.parceiro = parceiro;
    }

    @ManyToOne(targetEntity = Portifolio.class)
    @JoinColumn(name = "portifolio_id", nullable = false)
    public Portifolio getPortifolio() {
        return portifolio;
    }

    public void setPortifolio(Portifolio portifolio) {
        this.portifolio = portifolio;
    }

    @ManyToOne(targetEntity = Corretor.class)
    @JoinColumn(name = "corretor_id", nullable = true)
    public Corretor getCorretor() {
        return corretor;
    }

    public void setCorretor(Corretor corretor) {
        this.corretor = corretor;
    }

    @ManyToOne(targetEntity = Cliente.class)
    @JoinColumn(name = "cliente_id", nullable = false)
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    @ManyToOne(targetEntity = Usuario.class)
    @JoinColumn(name = "usuario_cadastro", nullable = false)
    public Usuario getUsuarioCadastro() {
        return usuarioCadastro;
    }

    public void setUsuarioCadastro(Usuario usuarioCadastro) {
        this.usuarioCadastro = usuarioCadastro;
    }

    @ManyToOne(targetEntity = Usuario.class)
    @JoinColumn(name = "usuario_finalizacao", nullable = true)
    public Usuario getUsuarioFinalizacao() {
        return usuarioFinalizacao;
    }

    public void setUsuarioFinalizacao(Usuario usuarioFinalizacao) {
        this.usuarioFinalizacao = usuarioFinalizacao;
    }

    @Column(name = "valor_proposta", nullable = false, scale = 2, precision = 10)
    public BigDecimal getValorProposta() {
        return valorProposta;
    }

    public void setValorProposta(BigDecimal valorProposta) {
        this.valorProposta = valorProposta;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "data_assinatura", nullable = false)
    public Calendar getDataAssinatura() {
        return dataAssinatura;
    }

    public void setDataAssinatura(Calendar dataAssinatura) {
        this.dataAssinatura = dataAssinatura;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "data_vigencia", nullable = false)
    public Calendar getDataVigencia() {
        return dataVigencia;
    }

    public void setDataVigencia(Calendar dataVigencia) {
        this.dataVigencia = dataVigencia;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "data_finalizacao", nullable = true)
    public Calendar getDataFinalizacao() {
        return dataFinalizacao;
    }

    public void setDataFinalizacao(Calendar dataFinalizacao) {
        this.dataFinalizacao = dataFinalizacao;
    }

    @Column(name = "motivo_finalizacao", nullable = true, length = 200)
    public String getMotivoFinalizacao() {
        return motivoFinalizacao;
    }

    public void setMotivoFinalizacao(String motivoFinalizacao) {
        this.motivoFinalizacao = motivoFinalizacao;
    }

    @Column(name = "percentual_comissao_recebida", nullable = false, scale = 2, precision = 5)
    public Double getPercentualComissaoRecebida() {
        return percentualComissaoRecebida;
    }

    public void setPercentualComissaoRecebida(Double percentualComissaoRecebida) {
        this.percentualComissaoRecebida = percentualComissaoRecebida;
    }

    @Column(name = "percentual_comissao_corretor", nullable = true, scale = 2, precision = 5)
    public Double getPercentualComissaoCorretor() {
        return percentualComissaoCorretor;
    }

    public void setPercentualComissaoCorretor(Double percentualComissaoCorretor) {
        this.percentualComissaoCorretor = percentualComissaoCorretor;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "data_recebimento_comissao", nullable = true)
    public Calendar getDataRecebimentoComissao() {
        return dataRecebimentoComissao;
    }

    public void setDataRecebimentoComissao(Calendar dataRecebimentoComissao) {
        this.dataRecebimentoComissao = dataRecebimentoComissao;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "data_pagamento_comissao", nullable = true)
    public Calendar getDataPagamentoComissao() {
        return dataPagamentoComissao;
    }

    public void setDataPagamentoComissao(Calendar dataPagamentoComissao) {
        this.dataPagamentoComissao = dataPagamentoComissao;
    }

    @Column(name = "valor_recebido_comissao", nullable = true, scale = 2, precision = 7)
    public BigDecimal getValorRecebidoComissao() {
        return valorRecebidoComissao;
    }

    public void setValorRecebidoComissao(BigDecimal valorRecebidoComissao) {
        this.valorRecebidoComissao = valorRecebidoComissao;
    }

    @Column(name = "valor_pago_comissao", nullable = true, scale = 2, precision = 7)
    public BigDecimal getValorPagoComissao() {
        return valorPagoComissao;
    }

    public void setValorPagoComissao(BigDecimal valorPagoComissao) {
        this.valorPagoComissao = valorPagoComissao;
    }

    @Column(name = "acatar_prejuizo", nullable = false, columnDefinition = "boolean default false")
    public boolean isAcatarPrejuizo() {
        return acatarPrejuizo;
    }

    public void setAcatarPrejuizo(boolean acatarPrejuizo) {
        this.acatarPrejuizo = acatarPrejuizo;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Proposta other = (Proposta) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 83 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }
}
